import Vue from 'vue'
import { ComponentModel } from '..'
import { Dict } from './global-data'

/**
 * “印刷机”
 * ##### 这是一个完整的模块集合，它由多个 TyperChunk、TyperPage、TyperFlow 构成
 * ##### TyperChunk 是封装的页面组件，如：左边的树是一个 TyperChunk、右边的数据列表是一个 TyperChunk
 * ##### TyperPage 通过 chunkKey 引用 TyperChunk，将模板渲染为页面
 * ##### TyperFlow 是个松散的流程配置，其通过对按钮扩展部分属性完成数据流转
 * @method initTyper 初始化“印刷机”
 * @method getChunk 获取块
 * @method getChunks 获取块集
 * @method getPage 获取页面
 * @method getPages 获取页面集
 * @method getFlow 获取流程
 * @method getFlows 获取流程集
 * @method getStep 获取流程步骤
 * @method getSteps 获取流程步骤集
 * @method getAction 获取流程操作
 * @method getActions 获取流程操作集
 */
export interface Typer {
  initTyper: (chunks: TyperChunk[], pages: TyperPage[], flows?: TyperFlow[]) => void
  getChunk: (chunkKey: string) => TyperChunk | null
  getChunks: (routeName?: string) => TyperChunk[]
  getPage: (routeName: string) => TyperPage | null
  getPages: (flowId?: string) => TyperPage[]
  getFlow: (flowId: string) => TyperFlow | null
  getFlows: () => TyperFlow[]
  getStep: (flowId: string, routeName: string) => TyperFlowStep | null
  getSteps: (flowId: string) => TyperFlowStep[]
  getAction: (flowId: string, routeName: string, id: string) => TyperFlowAction | null
  getActions: (flowId: string, routeName: string) => TyperFlowAction[]
}

/**
 * 块
 * @attribute components: ComponentModel[] 引用组件集 [可空]
 * @attribute chunkKey: string 块键
 * @attribute metaStorer: Map<metaType: string, TyperChunkMeta> 块元信息集
 */
export interface TyperChunk {
  components?: ComponentModel[]
  chunkKey: string
  metaStorer: Map<string, TyperChunkMeta>
}

/**
 * 块元信息
 * @attribute metaFunc: any 条目元信息函数
 */
export interface TyperChunkMeta {
  metaFunc: (vm: Vue) => any
}

/**
 * 页面
 * ##### 页面一般会由多个 TyperChunk 构成，为了保证 TyperChunk 的可重用性，TyperPage 通过 chunkKey 引用 TyperChunk
 * ##### 页面入口（主）块 chunkKey 取 routerName，子块取 ComponentModel.id
 * @attribute routeName: string 路由名，与路由定义中的名称一致
 * @attribute title: string 页面标题
 * @attribute descr: string 页面描述 [可空]
 * @attribute chunkKeys: string[] 块键集
 * @attribute dictStorer: Map<string, string | Dict> 字典集 [可空]
 */
export interface TyperPage {
  routeName: string
  title: string
  descr?: string
  chunkKeys: string[]
  dictStorer?: Map<string, string | Dict>
}

/**
 * 流程
 * ##### TyperFlow 中可以有多个 TyperFlowStep，TyperFlowStep 通过 routeName 引用一个 TyperPage
 * ##### TyperFlowStep 中可以有多个 TyperFlowAction，TyperFlowAction 通过 ComponentModel.id 关联到按钮
 * @attribute id: string 流程编号
 * @attribute title: string 流程标题
 * @attribute descr: string 流程描述 [可空]
 * @attribute steps: TyperFlowStep[] 流程步骤集
 */
export interface TyperFlow {
  id: string
  title: string
  descr?: string
  steps: TyperFlowStep[]
}

/**
 * 流程步骤
 * @attribute routeName: string 路由名，与 TyperPage 定义中的 routeName 一致
 * @attribute statusFilter: (data: any) => Map<string, string[]>[] 状态过滤 [可空]
 * @attribute actions: TyperFlowAction[] 流程操作集
 */
export interface TyperFlowStep {
  routeName: string
  statusFilter?: (data: any) => Map<string, string[]>[]
  actions: TyperFlowAction[]
}

/**
 * 流程操作
 * ##### TyperFlow、TyperFlowStep 是偏向于“管理”的描述，如：构建流程图需要依赖这些定义
 * @attribute id: string 按钮编号，通过 ComponentModel.id 关联到按钮
 * @attribute code: string 操作码
 * @attribute title: string 操作标题
 * @attribute icon: string 图标 [可空]
 * @attribute descr: string 操作描述 [可空]
 * @attribute branchs: TyperFlowActionBranch[] 操作标题
 * @attribute remark: boolean | ComponentModel[] 备注 [可空] [默认值为 false]
 * @attribute byQuerier: boolean 根据查询器操作数据 [可空] [默认值为 false]
 * @attribute click: function(data: any, byQuerier: boolean, flowRecord: TyperFlowRecord) 按钮执行的方法
 */
export interface TyperFlowAction {
  id: string
  code: string
  title: string
  icon?: string
  descr?: string
  branchs: TyperFlowActionBranch[]
  remark?: boolean | ComponentModel[]
  byQuerier?: boolean
  click: (data: any, byQuerier: boolean, flowRecord: TyperFlowRecord) => void
}

/**
 * 流程操作分支
 * @attribute pageTo: string 页面流转到 [可空]
 * @attribute statusTo: Map<string, string> 状态流转到 [可空]
 */
export interface TyperFlowActionBranch {
  pageTo?: string
  statusTo?: Map<string, string>
}

/**
 * 流程记录
 * @attribute flowId: string 操作码
 * @attribute chunkKey: string 操作码
 * @attribute routerName: string 操作码
 * @attribute code: string 操作码
 * @attribute title: string 操作标题
 * @attribute descr: string 操作描述 [可空]
 * @attribute pageTo: string 页面流转到 [可空]
 * @attribute statusTo: Map<string, string> 状态流转到 [可空]
 * @attribute remark: string | Map<string, string> 备注 [可空]
 */
export interface TyperFlowRecord {
  flowId: string
  chunkKey: string
  routerName: string
  code: string
  title: string
  descr?: string
  pageTo?: string
  statusTo?: Map<string, string>
  remark?: string | Map<string, string>
}

/**
 * 模块
 * @attribute getChunks: () => TyperChunk[] 获取块集
 * @attribute getPages: () => TyperPage[] 获取页面集
 * @attribute getFlows: () => TyperFlow[] 获取流程集
 */
export interface TyperModule {
  getChunks: () => TyperChunk[]
  getPages: () => TyperPage[]
  getFlows: () => TyperFlow[]
}
